package ar.edu.untref.robotica.simulador;


import java.util.LinkedList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

import org.newdawn.slick.AppGameContainer;
import org.newdawn.slick.BasicGame;
import org.newdawn.slick.Color;
import org.newdawn.slick.GameContainer;
import org.newdawn.slick.Graphics;
import org.newdawn.slick.Image;
import org.newdawn.slick.SlickException;
import org.newdawn.slick.geom.Path;
import org.newdawn.slick.geom.Point;
import org.newdawn.slick.geom.Rectangle;
import org.newdawn.slick.geom.Shape;
import org.newdawn.slick.geom.Transform;

public class GraficadorSlick extends BasicGame {

	private Escenario escenario;
	private Graphics graficador;
	// una celda es...pixeles (del graficador, no de la imagen)
	private double relacionPixelCelda = 1;
	// una celda es...centímetros
	private double relacionCentimetroCelda = Configuracion.instancia()
			.getRelacionCentimetroCelda();
	
	public GraficadorSlick(Escenario escenario) {

		super("Graficador");
		this.escenario = escenario;
		configurarVentana();
	}

	@Override
	public void init(GameContainer gc) throws SlickException {

	}

	@Override
	public void update(GameContainer gc, int i) throws SlickException {

	}

	@Override
	public void render(GameContainer gc, Graphics graficador)
			throws SlickException {

		this.graficador = graficador;
		graficador.drawString("Howdy!", 100, 100);
		dibujarImagen();
		dibujarRobot();

	}

	public void configurarVentana() {

		try {
			AppGameContainer appgc;
			appgc = new AppGameContainer(this);
			appgc.setDisplayMode(800, 600, false);
			appgc.setAlwaysRender(true);
			appgc.start();
		} catch (SlickException ex) {
			Logger.getLogger(GraficadorSlick.class.getName()).log(Level.SEVERE,
					null, ex);
		}
	}

	private void dibujarImagen() {

		Image imagen;
		try {
			imagen = new Image(Configuracion.instancia().getRutaDelMapa());
			imagen.draw();
		} catch (SlickException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	public void dibujarRobot() {

		//graficador.setPaint(Color.blue);
		graficador.setColor(Color.blue);
		graficador.draw(this.getShapeRobot());
	}

	public Shape getShapeRobot() {

		double altoRobot = Configuracion.instancia().getAltoRobot();
		double anchoRobot = Configuracion.instancia().getAnchoRobot();
		Posicion posicionRobot = escenario.getPosicionRobot();
		List<Point> puntos = new LinkedList<Point>();
		Point punto0 = new Point((float)(posicionRobot.getPosicionX()
				- (anchoRobot / relacionCentimetroCelda) / 2),(float)(
				posicionRobot.getPosicionY()
						- (altoRobot / relacionCentimetroCelda) / 2));
		Point punto1 = new Point((float)(punto0.getX() + anchoRobot
				/ relacionCentimetroCelda), punto0.getY());
		Point punto2 = new Point(punto1.getX(), (float)(punto1.getY()
				+ altoRobot / relacionCentimetroCelda));
		Point punto3 = new Point(punto0.getX(), punto2.getY());
		puntos.add(punto0);
		puntos.add(punto1);
		puntos.add(punto2);
		puntos.add(punto3);
		// Recorrer path
		Path path = new Path(punto0.getX(),punto0.getY());
		for (int i = 1; i < puntos.size(); i++) {
			path.lineTo(puntos.get(i).getX(), puntos.get(i).getY());
		}
		path.close();
		
		
		Rectangle rectangulo = new Rectangle(punto0.getX(), punto0.getY(), (float) anchoRobot, (float) altoRobot);
		rectangulo.transform(Transform.createRotateTransform((float)Math.toRadians(escenario.getPosicionRobot()
				.getAngulo())));
		return path.transform(Transform.createRotateTransform((float)Math.toRadians(escenario.getPosicionRobot()
				.getAngulo()),path.getCenterX(),path.getCenterY()));
	}
}
